package ufmg.aprendizado.ga;

import java.util.ArrayList;
import java.util.List;

import ufmg.aprendizado.Main;
import ufmg.arcabouco.ga.IndividuoGA;

public class Individuo extends IndividuoGA {

	public Individuo(double[] ds) {
		super(ds);
	}

	@Override
	public void mutacao() {
		double valor = Main.rand.nextDouble() * 10;
		if (valor == 0) {
			valor = 1 + Main.rand.nextInt(10) + Main.rand.nextDouble();
		}
		int posicao = Main.rand.nextInt(2);
		genome[posicao] = valor;
	}

	@Override
	public List<IndividuoGA> crossOver(IndividuoGA mother) {
		List<IndividuoGA> filhos = new ArrayList<IndividuoGA>();

		int ponto = 1 + Main.rand.nextInt(this.genome.length - 1);

		double ind[] = new double[this.genome.length];
		double ind2[] = new double[this.genome.length];

		for (int i = 0; i < ponto; i++) {
			ind[i] = this.genome[i];
			ind2[i] = mother.getGenome()[i];
		}
		for (int i = ponto; i < this.genome.length; i++) {
			ind[i] = mother.getGenome()[i];
			ind2[i] = this.genome[i];
		}

		filhos.add(new Individuo(ind));
		filhos.add(new Individuo(ind2));
		return filhos;
	}

	public void print() {
		System.out.println(getGenome()[0] + " " + getGenome()[1] + " "
				+ getGenome()[2]);
	}

	@Override
	public int compareTo(IndividuoGA ind) {
		if (this.fitness == ind.getFitness()) {
			return 0;
		} else if (this.fitness < ind.getFitness()) {
			return 1;
		} else {
			return -1;
		}
	}

	@Override
	public boolean equals(Object obj) {
		Individuo ind = (Individuo) obj;
		for (int i = 0; i < genome.length; i++) {
			if (genome[i] != ind.genome[i]) {
				return false;
			}
		}
		return true;
	}

}
